import os
import xlrd,xlwt,xlutils
from xlutils.copy import copy


# 第一类：创建表格
def creat_execel_write(col_name_tuple, save_path, sheet_name="sheet0"):
    """
    功能：实现新建sheet页，并进行赋值（列名）
    :param sheet_name: sheet页自定义名称
    :param col_name_tuple:以元组的形式定义 首行字段名
    :param save_path:文件存储路径
    :return:
    """
    # 创建book实例：编码格式=utf-8，是否压缩=否
    book = xlwt.Workbook(encoding='utf-8', style_compression=0)
    # 创建表单
    sheet = book.add_sheet(sheet_name, cell_overwrite_ok=True)
    # 添加列名
    for i in range(len(col_name_tuple)):
        sheet.write(0, i, col_name_tuple[i],
                    style=xlwt.easyxf('font: bold on; align: wrap on, vert centre, horiz center'))
    book.save(save_path)


#第二类：查询表格
def get_some_cols_values(file_name,sheet_num,start_col,end_col):
    """
    功能：实现获取某个sheet页（sheet_num）中从[start_row,end_row]行的数据，并存储到list中
    *list中每个元素为一行数据
    :param file_name:文件的名称
    :param sheet_num:要查询第n个sheet页   n取值范围为【1，sheet个数】
    :param start_col:要查询的开始的列号    start_col取值范围[1,sheet最大列号]
    :param end_col: 要查询的结束的列号    end_col取值范围[1,∞]
    :return:col_data_list
    """
    file_path = os.path.dirname(os.path.abspath(__file__))
    base_path = os.path.join(file_path,file_name)
    #打开文件
    data = xlrd.open_workbook(base_path)
    table = data.sheets()[sheet_num - 1]
    #针对填写的末列号大于总行号的情况进行处理
    if end_col > table.ncols:
        end_col = table.ncols
    #针对首列号填写进行检查，并将获取的值存储到list中
    if start_col > table.ncols:
        print("请检查起始列，当前检测到起始列大于表格的最大列数了")
    else:
        col_data_list = []
        for i in range(start_col-1,end_col):
            col_data_list.append(table.col_values(i))
        return col_data_list


def get_some_zone_values(file_name, sheet_num, row_min, row_max, col_min, col_max):
    """
    功能：实现行号【row_min,row_max】->【col_min,col_max】之间的表格中的数据
    最终存储到嵌套list中，每个子list为一行数据
    对于cell中为int转换为string，date转换为"%Y-%m-%d %H:%M:%S"
    :param file_name: 文件的名称
    :param sheet_num: 要查询第n个sheet页   n取值范围为【1，sheet个数】
    :param row_min: 要查询的开始的行号，取值范围【1，∞）
    :param row_max: 要查询的结束的行号，取值范围【1，∞）
    :param col_min: 要查询的开始的列号，取值范围【1，∞）
    :param col_max: 要查询的结束的列号，取值范围【1，∞）
    :return: zone_data_list
    """
    file_path = os.path.dirname(os.path.abspath(__file__))
    base_path = os.path.join(file_path, file_name)
    # 打开文件
    data = xlrd.open_workbook(base_path)
    table = data.sheets()[sheet_num - 1]
    # 针对填写的末列号大于总行号的情况进行处理
    if col_max > table.ncols:
        col_max = table.ncols
    if row_max > table.nrows:
        row_max = table.nrows
    # 针对首列号填写进行检查，并将获取的值存储到list中
    if col_min > table.ncols or row_min > table.nrows:
        print("请检查起始列/起始行，当前检测到起始值大于表格的最大值了")
    else:
        zone_data_list = []
        # 进行存储数据
        for i in range(row_min - 1, row_max):
            row_data_list = []
            for j in range(col_min - 1, col_max):
                cell = table.cell(i, j)
                if cell.ctype == xlrd.XL_CELL_TEXT:
                    row_data_list.append(cell.value)
                elif cell.ctype == 2 and cell.value % 1 == 0.0:
                    cell = int(cell.value)
                    row_data_list.append(str(cell))
                elif cell.ctype == 3:
                    dt = xlrd.xldate_as_datetime(cell.value, 0)
                    end_time = dt.strftime("%Y-%m-%d %H:%M:%S")
                    row_data_list.append(end_time)
            zone_data_list.append(row_data_list)

        return zone_data_list


#第三类：修改表格
def write_execel_datadictlist(sheet_num, datadictlist, savepath):
    """
    功能：打开文件，并将[{},{},{}]中每一个{}写入表中
    :param datadictlist: [{1,2,3},{"one","two","three"},{"一","二","三"}]
    :param savepath: 文件名
    :return:
    """

    xls = xlrd.open_workbook(savepath, formatting_info=True)
    # 获取原数据
    wbook = xlutils.copy.copy(xls)
    wsheet = wbook.get_sheet(sheet_num)

    # 获取表格内容和总行数和总列数
    table = xls.sheets()[sheet_num]
    nrows = table.nrows
    ncols = table.ncols
    for i in range(len(datadictlist)):
        # 获取到每一个dict的值，并转化为list
        datadict_values = list(datadictlist[i].values())
        # 每一个值保存完毕
        # for i in range(ncols):
        for j in range(0, len(datadict_values)):
            # print(j,datadict_values[j])
            wsheet.write(nrows, j, datadict_values[j],
                         style=xlwt.easyxf('font: bold on; align: wrap on, vert centre, horiz center'))
        nrows += 1
    wbook.save(savepath)  # 最后进行保存
